package leetcode_61_80;

public class isNumber_65 {
    public boolean isNumber(String s) {
        /**
         * 有效数字（按顺序）可以分成两部分：
         * 1，一个 小数 或者 整数
         * 2，（可选）一个 'e' 或 'E' ，后面跟着一个 整数
         *
         * 三种有效数字格式
         * 小数
         * （+-）1.1
         * （+-）.1
         * （+-）1.
         * 整数
         * （+-）1
         * （+-）e/E 1
         * 科学计数法
         * 小数/整数 E/e 整数
         *
         * 1ms 100%
         */
        int point_index=-1,E_index=-1,point_count=0,E_count=0;      //找到小数点位置，E位置
        if(s.length()==1)
            return 0<=s.charAt(0)-'0'&&s.charAt(0)-'0'<10;
        int i=0;
        if(s.charAt(i)=='+'|| s.charAt(i)=='-') //处理第一位
            i=1;
        for(;i<s.length();i++){
            if(s.charAt(i)=='e'||s.charAt(i)=='E'){
                if(i==0||i==s.length()-1) //e必须在中间位置
                    return false;
                E_count++;
                if(E_count == 2)
                    return false;
                E_index=i;
            }
            else if(s.charAt(i)=='.'){
                point_count++;
                if(point_count == 2)
                    return false;
                point_index=i;
            }
            else if(0>s.charAt(i)-'0' || s.charAt(i)-'0'>=10) //不是.和e和E，也不是数字，直接返回false
                return false;
        }
        if(E_index!=-1) { //是科学计数法
            if (point_index != -1) //E前是小数
                return isDecimals(s.substring(0, E_index), point_index) && isInteger(s.substring(E_index + 1));
            else
                return isInteger(s.substring(0, E_index)) && isInteger(s.substring(E_index + 1));
        }else{
            if(point_index != -1) //是小数
                return isDecimals(s, point_index);
            else
                return isInteger(s);
        }
    }

    /**
     * 验证是否是整数
     * @param a
     * @return
     */
    public boolean isInteger(String a){
        int i=0;
        if(a.charAt(i)=='+'|| a.charAt(i)=='-'){ //验证第一位
            if(a.length()==1)
                return false;
            i=1;
        }
        for(;i<a.length();i++){
            if(0>a.charAt(i)-'0' || a.charAt(i)-'0'>=10)
                return false;
        }
        return true;
    }
    /**
     * 验证是否是小数
     * @param a
     * @return
     */
    public boolean isDecimals(String a,int idx){
        int i=0,numCount=0;
        if(a.charAt(i)=='+'|| a.charAt(i)=='-')
            i=1;
        for (; i < a.length(); i++) {
            if(i==idx){}
            else if (0>a.charAt(i)-'0' || a.charAt(i)-'0'>=10)
                return false;
            else
                numCount++;
        }
        return numCount>0;
    }
}
